package com.ruoyi.system.mapper;

import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.system.domain.MbtiTestRecord;

/**
 * MBTI测试记录Mapper接口
 * 
 * @author ruoyi
 * @date 2025-01-21
 */
public interface MbtiTestRecordMapper 
{
    /**
     * 查询MBTI测试记录
     * 
     * @param recordId MBTI测试记录主键
     * @return MBTI测试记录
     */
    public MbtiTestRecord selectMbtiTestRecordByRecordId(Long recordId);

    /**
     * 查询MBTI测试记录列表
     * 
     * @param mbtiTestRecord MBTI测试记录
     * @return MBTI测试记录集合
     */
    public List<MbtiTestRecord> selectMbtiTestRecordList(MbtiTestRecord mbtiTestRecord);

    /**
     * 根据用户ID查询测试记录列表
     * 
     * @param userId 用户ID
     * @return MBTI测试记录集合
     */
    public List<MbtiTestRecord> selectTestRecordsByUserId(Long userId);

    /**
     * 根据用户ID和测试类型ID查询最新的测试记录
     * 
     * @param userId 用户ID
     * @param testTypeId 测试类型ID
     * @return MBTI测试记录
     */
    public MbtiTestRecord selectLatestTestRecord(@Param("userId") Long userId, @Param("testTypeId") Long testTypeId);

    /**
     * 新增MBTI测试记录
     * 
     * @param mbtiTestRecord MBTI测试记录
     * @return 结果
     */
    public int insertMbtiTestRecord(MbtiTestRecord mbtiTestRecord);

    /**
     * 修改MBTI测试记录
     * 
     * @param mbtiTestRecord MBTI测试记录
     * @return 结果
     */
    public int updateMbtiTestRecord(MbtiTestRecord mbtiTestRecord);

    /**
     * 删除MBTI测试记录
     * 
     * @param recordId MBTI测试记录主键
     * @return 结果
     */
    public int deleteMbtiTestRecordByRecordId(Long recordId);

    /**
     * 批量删除MBTI测试记录
     * 
     * @param recordIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteMbtiTestRecordByRecordIds(Long[] recordIds);

    /**
     * 批量更新测试记录状态
     *
     * @param recordIds 记录ID数组
     * @param status 状态
     * @param updateBy 更新者
     * @return 更新记录数
     */
    public int batchUpdateStatus(@Param("recordIds") Long[] recordIds, @Param("status") String status, @Param("updateBy") String updateBy);

    /**
     * 统计测试记录总数
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 总数
     */
    public int countTestRecords(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 统计已完成的测试记录数
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 已完成数
     */
    public int countCompletedTestRecords(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 统计各状态的测试记录数
     *
     * @return 状态统计
     */
    public List<Map<String, Object>> countRecordsByStatus();

    /**
     * 统计人格类型分布
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 人格类型分布
     */
    public List<Map<String, Object>> countPersonalityDistribution(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 统计每日测试记录数
     *
     * @param days 天数
     * @return 每日统计
     */
    public List<Map<String, Object>> countDailyTestRecords(@Param("days") int days);

    /**
     * 获取平均测试时长
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 平均时长（秒）
     */
    public Double getAverageTestDuration(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 获取测试记录详情（含关联信息）
     *
     * @param recordId 测试记录ID
     * @return 测试记录详情
     */
    public Map<String, Object> selectTestRecordDetail(Long recordId);
}
